﻿#pragma once
#include <GLES3/gl3.h>

class GLProgram
{
public:
	/**
	*  创建
	*
	*  @param vertShaderSrc 顶点着色器字符串指针
	*  @param fragShaderSrc 片段着色器字符串指针
	*
	*  @return 着色器对象
	*/
	static GLProgram* create(const char* vertShaderSrc, const char* fragShaderSrc);

	/** 调用glGetAttribLocation() */
	GLint getAttribLocation(const char* name);

	/** 调用glGetUniformLocation() */
	GLint getUniformLocation(const char* name);

	/** 调用glUseProgram() */
	void use();

	GLProgram();
	~GLProgram();

private:
	// 着色器对象
	GLuint _program;

	// 顶点着色器句柄
	GLuint _vertexShader;

	// 片段着色器句柄
	GLuint _fragmentShader;

	/**
	*  初始化
	*
	*  @param vertShaderSrc 顶点着色器字符串指针
	*  @param fragShaderSrc 片段着色器字符串指针
	*
	*  @return 是否成功
	*/
	bool init(const char* vertShaderSrc, const char* fragShaderSrc);

	/** 删除着色器 */
	void clearShader();

	/**
	*  编译着色器
	*
	*  @param type      着色器类型
	*  @param shaderSrc 着色器字符串指针
	*
	*  @return 着色器句柄
	*/
	GLuint loadShader(GLenum type, const char* shaderSrc);

	/** 查看着色器变量 */
	void printVertexAttribs();
};